#ifndef QLSCORESYSTEM_H
#define QLSCORESYSTEM_H

#include <QMouseEvent>
#include <QHBoxLayout>
#include <QMutex>
#include <QShowEvent>

#include <QWidget>

#include "../DevBase/dllQLsDBManager/Service/UserService.h"
#include "../DevBase/dllQLsPluginsManager/qlspluginsmanagerpool.h"

#define IsBorderLess 1			/* 是否隐藏边框 */
/**
 * 主窗口最好不设置 QGraphicsDropShadowEffect ，会令所有子控件都继承该属性。
 * 所以修改主控界面阴影边框的方式，改为QPainter自绘，而不是通过QGraphicsDropShadowEffect设置阴影效果。
 * 本次主要解决了 QLsAVWidget 中底部控制栏自动显隐时通过 QGraphicsDropShadowEffect 设置透明度没反应的冲突;
 */
#define IsShadow 1				/* 是否显示阴影 */
#define AUTO_ScaleUI 0			/* 是否自动适应系统缩放 */

QT_BEGIN_NAMESPACE
namespace Ui { class QLsCoreSystem; }
QT_END_NAMESPACE

class QLsCoreSystem : public QWidget
{
	Q_OBJECT

public:
	QLsCoreSystem(QWidget *parent = nullptr);
	~QLsCoreSystem();

signals:
	/* 加载插件信号 */
	void sigLoad(PluginInfo&);

public slots:
	/* 登录的槽函数 */
	void slotLogin(const User &user);
	/* 插件管理器最小尺寸变化的槽函数 */
	void slotShowTabWidgetChangeMinimumSize(QSize size);
#if AUTO_ScaleUI
	/* windows缩放(每英寸逻辑点)的变化 的槽函数 */
	void onLogicalDotsPerInchChanged(qreal dpi);
#endif

protected:
#if IsBorderLess
	/* 鼠标事件重载 - 移动事件 */
	void mouseMoveEvent(QMouseEvent *event);
	/* 鼠标事件重载 - 按下事件 */
	void mousePressEvent(QMouseEvent *event);
	/* 鼠标事件重载 - 释放事件 */
	void mouseReleaseEvent(QMouseEvent *event);
#endif
	/* 事件过滤器 */
	bool eventFilter(QObject *target, QEvent *event);
	/* 绘图事件重载 */
	void paintEvent(QPaintEvent *event);

private:
	/* 主界面初始化 */
	void HomeInit();
	/* 设置初始化 */
	void SetInit();
#if AUTO_ScaleUI
	/* 缩放UI */
	int ScaleUI(int spec);
	/* 根据缩放设置尺寸 */
	void SetSizeWithScale(const QObject &o);
#endif

private slots:
	/* 最大化/还原窗口 */
	void on_maxiBtn_clicked();
	/* 设置主题二级菜单的槽函数 */
	void slotSetThemesActionsTriggered();
	/* 插件管理二级菜单的槽函数 */
	void slotPluginManagerActionsTriggered();
	/* 日志输出到控件 */
	void slotWriteLog(const QString &message, int level);
	/* 切换语言二级菜单的槽函数 */
	void slotChangeLanguageActionsTriggered();
	/* 日志表格右键弹出菜单的槽函数 */
	void on_recordTableWidget_customContextMenuRequested(const QPoint &pos);
	/* 日志表格右键菜单消息处理的槽函数 */
	void slotRecordActionDeal();
	/* 加载、卸载插件的槽函数 */
	void slotPluginLoad(PluginInfo &pluginInfo);

private:
	Ui::QLsCoreSystem *ui;

	User me;

	/* 窗口数据，无边框移动、缩放 */
	int m_miniWidth;
	int m_miniHeight;
	int m_tabWidgetMiniWidth;
	int m_tabWidgetMiniHeight;
#if IsBorderLess
	bool m_bSize;									/* 能否缩放 */
	bool m_bMove;									/* 能否移动 */
	bool m_bSizeOrMove;								/* 缩放: true; 移动: false; */
	QPoint m_PointWindow;							/* 鼠标左键按下位置 */
	bool m_bPress;									/* 鼠标左键是否按下 */

#endif

#if AUTO_ScaleUI
	/* 适应Windows缩放百分比 */
	double m_preRate;
	double m_scaleFromPreRate;
#endif

	QString m_curThemeName;							/* 当前主题名 */
	QString m_curLangPack;							/* 当前语言包名 */

	QMutex m_recordTableWidgetMutex;				/* recordTableWidget互斥锁 */
};
#endif // QLSCORESYSTEM_H
